package modele;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import javax.swing.AbstractListModel;

/**
 * Represente une collection d'albums
 * @author Plancq Charlotte, Lanvin Kévin, Darras Raphael
 *
 *
 */
public class CollectionAlbums extends AbstractListModel {
	private static final long serialVersionUID = 1L;
	/**
	 * Donne le nom a la collection
	 */
	protected String nom;
	/**
	 * Liste des differents albums de la collection
	 */
	protected List<Album> albums;
	
	/**
	 * BDtheque a laquelle appartient la collection
	 */
	protected Bdtheque bdt;
	
	/**
	 * Constructeur de la classe
	 * @param BDtheque
	 * @param String
	 */
	public CollectionAlbums (Bdtheque bdt, String nom){
		this.albums=new ArrayList<Album>();
		this.nom=nom;
		this.bdt=bdt;
	}
	
	/**
	 * Retourne un iterateur de la collection
	 * @return Iterator
	 */
	public Iterator<Album> iterator(){
		return albums.iterator();
	}
	/**
	 * Ajoute l'album a a la collection
	 * Retourne faux en cas d'erreur
	 * @param a
	 * @return boolean
	 */
	public boolean add(Album a){
		return albums.add(a);
	}
	/**
	 * Ajoute tout les albums d'une collection entree en parametre
	 * dans la collection courante.
	 * retourne faux en cas d'erreur
	 * @param Collection <Album>
	 * @return boolean
	 */
	public boolean addAll(Collection <Album> arg0){
		return albums.addAll(arg0);
	}
	/**
	 * Supprime l'album a de la collection
	 * retourne faux en cas d'erreur
	 * @param Album a
	 * @return boolean
	 */
	public boolean remove(Album a){
		return albums.remove(a);
	}
	
	/**
	 * retourne vrai si la collection contient l'album a en parametre, faux sinon
	 * @param Album a
	 * @return boolean
	 */
	public boolean contains(Album a){
		return albums.contains(a);
	}
	/**
	 * vide la collection
	 */
	public void clear(){
		albums.clear();
	}
	
	/**
	 * retourne une liste de tout les albums de la collection
	 * @return List<Album>
	 */
	public List<Album> getAlbums(){
		return albums;
	}

	/**
	 * donne le nom de la collection
	 * @return String
	 */
	public String getNom(){
		return this.nom;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((albums == null) ? 0 : albums.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		CollectionAlbums other = (CollectionAlbums) obj;
		if (albums == null) {
			if (other.albums != null)
				return false;
		} else if (!albums.equals(other.albums))
			return false;
		return true;
	}

	/**
	 * Donne une liste de tout les albums de la collection
	 * correspondant a l'album entré en parametre
	 * @param Album a
	 * @return List<Album>
	 */
	public List<Album> rechercherAlbum(Album a) {
		List<Album> resultat= new ArrayList<Album>();
		for(Album alb : albums){
			if (alb.correspond(a))
				resultat.add(alb);
		}
		return resultat;
	}
	/**
	 * Donne le nombre d'album contenu dans la collection
	 * @return int
	 */
	@Override
	public int getSize() {
		return this.albums.size();
	}

	/**
	 * Indique l'album se trouvant a l'index indique en parametre
	 * @return Album
	 */
	@Override
	public Album getElementAt(int index) {
		return albums.get(index);

	}
	

	/**
	 * donne le nom de la collection
	 * @return String
	 */
	public String toString(){
		return this.getNom();
	}

	/**
	 * Retourne l'index de la position a laquelle se trouve
	 * l'album en parametre dans la collection
	 * @param Album a
	 * @return int
	 */
	public int getIndexOf(Album a) {
		return this.albums.indexOf(a);
	}
	
	/**
	 * Attribue un nom a la collection
	 * retourne faux en cas d'erreur
	 * @param String
	 * @return boolean
	 */
	
	public boolean setNom (String s) {
		this.nom = s;
		return true;
	}

	
}
